<?php
namespace app\port\controller;
class Task extends Common{
	/**
	 * 获取任务菜单列表
	 * @return json
	 */
	function navs(){
        $navs=model('taskgroup')->readAll(['status'=>1,'phone'=>1],0,['with'=>'taskoptionsphone']);
        $prefix=request()->domain().'/taskicon/';
        $suffix='.png';
        foreach ($navs as $key => $v) {
            foreach ($v['taskoptionsphone'] as $k => $c) {
                $c['icon']=$prefix.$c['icon'].$suffix;
                if(is_string($c['params'])){
                    $c['params']=json_decode($c['params'],true);
                }
            }
            $navs[$key]['children']=$v['taskoptionsphone'];
        }
		return json(['data'=>$navs]);
	}
	/**
     * 创建任务
     * 任务参数请参照 member/controller/msg.php
     */
	function add(){
        set_time_limit(0);
		$post=input('');
        $validate=$this->validate($post,[
            'event|任务指令Event'=>'require',
            'action|任务指令Action'=>'require',
            'title|任务标题'=>'require',
        ]);
        if(true!==$validate){
            return json($validate,1);
        }
        $uid=$this->user['id'];
        if($post['event']==='extraTask'&&$post['action']==3){
            // 微信消息采集任务
            $dev=isset($post['dev'])?$post['dev']:[];
            if(is_string($dev)){
                $dev=json_decode($dev,true);
            }
            $dev=array_unique($dev);
            $model=model('device');
            foreach ($dev as $v) {
                $model->isCreateWxMsgTask($uid,$v,true);
            }
            return json('创建采集队列任务成功');
        }
        $remark=model('Taskoptions')->getTaskEvent($post['event'],$post['action']);
        if(empty($remark)){
            return json(lang('Instruction event does not exist'),1);
        }
        $post['type']=$remark['type'];
        $post['remark']=$remark['remark'];
        
        // 组装任务数据
        $data=$this->getTaskData($post,$uid);
        $rs=success();
        // 查询手机号是否微信号
        if($data['event']==='extraTask'&&$data['action']==1){ 
            if(empty($data['dev'])||empty($data['software'])){
                $this->error('请至少选择一个微信执行任务');
            }
            $rs=model('mobile')->createQueryWx($data,$user['id']);
        }else{
            //多媒体文件ID组
            $files=[];
            // 多媒体文件上传
            $_numbers=range(0,8);
            foreach($_numbers as $v) {
                $_inputName='file'.$v;
                //$_inputName='file';
                $file=request()->file($_inputName);
                if($file){
                    //return json('返回的数据',1,$_FILES);
                    $rs=$this->uploads($file,$_inputName);
                    if(!empty($rs)){
                        if(is_integer(key($rs))){
                            foreach ($rs as $v) {
                                $files[]=$v['id'];
                            }
                        }else{
                            $files[]=$rs['id'];
                        }
                    }else{
                        return json(lang('Upload failure'),1);
                    }
                    unset($post[$_inputName]);
                }
            }
            // 创建任务 
            $rs=$this->createTask($data,$uid,$files);
        }
        if($rs['success']){
            return json(lang('Create success'));
        }
        return json($rs['msg'],1);
	}

    // 新任务  候选任务    任务管理器   已完成任务
    


    /**
     * 新任务列表
     * @param  [String] [token] [用户登录凭证]
     * @param  [int]    [page]  [当前页码，为空时取第一页的数据]
     * @param  [JSON]   [data]  [用户提交信息]
     *                      [pageno] [分页的每页条数，为空时取配置设置的条数]
     * @return [type] [返回json数据]
     */
    function task(){
        $count=input('count/d',0);
        if($count<=0){
           $count=true;
        }
        $list=model($this->tasking)->getTask(['status'=>0,'member_id'=>$this->user['id']],$count);
       
        if (!empty($list)) {
            // foreach ($list as $k => $v) {
            //     $list[$k]['options'] = json_decode($v['options'],true);
            // }
            return json('获取数据成功',0,$list->toArray());
        }
        else{
            return json('获取数据失败',1);
        }
    }

    /**
     * 候选任务
     * @param  [String] [token] [用户登录凭证]
     * @param  [int]    [page]  [当前页码，为空时取第一页的数据]
     * @param  [JSON]   [data]  [用户提交信息]
     *                      [pageno] [分页的每页条数，为空时取配置设置的条数]
     * @return [type]   [返回json数据]
     */
    function tasking(){
        $count=input('count/d',0);
        if($count<=0){
            $count=true;
        }
        $list=model($this->tasking)->getTask(['status'=>['status','in',[1,2]],'member_id'=>$this->user['id']],$count);
        if (!empty($list)) {
            // foreach ($list as $k => $v) {
            //     $list[$k]['options'] = json_decode($v['options'],true);
            // }
            return json('获取数据成功',0,$list->toArray());
        }else{
            return json('获取数据失败',1);
        }
    }


    /**
     * 已完成任务
     * @param  [String] [token] [用户登录凭证]
     * @param  [int]    [page]  [当前页码，为空时取第一页的数据]
     * @param  [JSON]   [data]  [用户提交信息]
     *                      [pageno] [分页的每页条数，为空时取配置设置的条数]
     * @return [type] [返回json数据]
     */
    function tasked(){
        $count=input('count/d',0);
        if($count<=0){
           $count=true;
        }
        $list=model($this->tasked)->getTask(['member_id'=>$this->user['id']],$count);
        if (!empty($list)) {
            // foreach ($list as $k => $v) {
            //     $list[$k]['options'] = json_decode($v['options'],true);
            // }
            return json('获取数据成功',0,$list->toArray());
        }
        else{
            return json('获取数据失败',1);
        }
    }
    /**
     * 删除任务
     * @param  integer $id 任务ID
     * @return json
     */
    function del($id=0){
        $ids=input('ids',[]); // 多项删除
        if($id<=0&&empty($ids)){
            return json(lang('Data does not exist'),1);
        }
        if(is_string($ids)){
            $ids=json_decode($ids,true);
        }
        $member_id=$this->user['id'];
        $wxmsg_task_id=$this->user['wxmsg_task_id'];
        if($id==$wxmsg_task_id){
            return json('该消息采集任务不可删除，可在用户中心中设置采集间隔',1);
        }
        $where=['id'=>$id,'member_id'=>$member_id];
        $_map=['task_id'=>$id];
        if(!empty($ids)){
            $i=array_search($wxmsg_task_id, $ids);

            if(false!==$i){
                unset($ids[$i]);
            }
            $where=[
                'member_id'=>$member_id,
                'id'=>['id','in',$ids]
            ];
            $_map=['task_id'=>['task_id','in',$ids]];
        }
        
        $tasking=$this->tasking;
        $table=input('table/s',$tasking);
        $model=$table==$tasking?model($tasking):model($this->tasked);
        $del=$model->del($where);
        if($del){
            $device=model('task_device')->readAll($_map,0,['field'=>'device_id']);
            // 执行中
            $deving=model('task_device')->readAll(array_merge($_map,['state'=>1]),0,['field'=>'device_id']);
            if(count($device)){
                // 移除队列
                $_del=model('task_device')->del($_map);
                if($_del){
                    
                    foreach ($device as $k => $v) {
                        $device[$k]=$v['device_id'];
                    }
                    if(count($deving)){
                        // 移除了正在执行的任务队列应该进行 下一个任务
                        $taskDevModel=model('task_device');
                        foreach ($deving as $k => $v) {
                            $taskDevModel->nextTask($member_id,$v['device_id']);
                        }
                    }else{
                        // 通知任务队列更新
                        model('task_device')->updateDev($member_id,[],$device);
                    }
                }
            }
            return json(lang('Successful operation'));
        }
        return json(lang('Failed operation'),1);
    }


    /**
     * 任务管理器(通过在线设备ID获取设备的任务列表)
     * @param  [JSON]   [data]  [用户提交信息]
     *                      [ids] [设备ID数组]
     * @return json
     */
    function getData($ids=''){
        if(is_string($ids)){
            $ids=json_decode($ids,true);
        }
        if(empty($ids)){
            return json('获取数据成功',0,[]);
        }
        $list=model('device')->getTaskQueue($this->user['id'],$ids);

        return json('获取数据成功',0,$list);
    }
    /**
     * 任务管理器中移除设备任务
     * @param  integer $device_id 设备ID
     * @param  integer $id        设备任务ID （表task_device）
     * @return json
     */
    function remove($device_id=0,$id=0){
        $ids = input('ids',[]);
        if($device_id<=0||($id<=0&&empty($ids))){
            return json(lang('Data does not exist'),1);
        }
        if(is_string($ids)){
            $ids=json_decode($ids,true);
        }
        $uid=$this->user['id'];
        $where=[
            'member_id'=>$uid,
            'device_id'=>$device_id,
            'id'=>$id,
        ];
        if(!empty($ids)){
            $where['id']=['id','in',$ids];
        }
        $has=db('task_device')->where($where)->count();
        if($has<=0){
            return json('该项不存在',1);
        }
        $del=model('task_device')->del($where);
        if(!$del){
            return json('系统繁忙、删除失败',1);
        }
        //通知后台任务管理器更新任务队列
        model('task_device')->updateDev($uid,[],$device_id);
        return json('移除成功');
    }
    /**
     * 任务列表的上下移动
     * @param  integer  $device_id 设备ID
     * @param  integer    $pre_id 前一项ID
     * @param  integer    $after_id 后一项ID
     * @return json
     */
    function record($device_id=0,$pre_id=0,$after_id=0){
        if($device_id<=0){
            return json('设备不存在',1);
        }
        if($pre_id<=0||$after_id<=0){
            return json('数据不完整',1);
        }
        $uid=$this->user['id'];
        $where=[
            'member_id'=>$uid,
            'device_id'=>$device_id,
            'state'=>0,
            'id'=>['id','in',[$pre_id,$after_id]],
        ];
        $has=model('task_device')->read($where,0,['field'=>'id,sort']);
        if(count($has)!==2){
            return json('该任务已移除或者正在执行中',1);
        }
        $val=[
            [
                'id'=>$has[0]['id'],
                'sort'=>$has[1]['sort'],
            ],
            [
                'id'=>$has[1]['id'],
                'sort'=>$has[0]['sort'],
            ]
        ];
        $save=model('task_device')->edit($val);
        if(!$save){
            return json('系统繁忙、操作失败',1);
        }
        //通知后台任务管理器更新任务队列
        model('task_device')->updateDev($uid,[],$device_id);
        return json('操作成功');
    }
    /**
     * 会员点击完成任务按钮
     * @param  integer $device_id 设备ID
     * @return json
     */
    function finish($device_id=0){
        if($device_id<=0){
            return json('设备不存在',1);
        }
        $uid=$this->user['id'];
        $has=db('device')->where(['member_id'=>$uid,'id'=>$device_id])->count();
        if($has<=0){
            return json('设备不存在',1);
        }
        $rs=model('task_device')->nextTask($uid,$device_id,true,true);
        if($rs['success']){
            return json($rs['msg']);
        }
        return json($rs['msg'],1);
    }
    /**
     * 一键清空所有任务
     * @return [type] [description]
     */
    function clearAll(){
        if(request()->isAjax()||request()->isPost()){
            $user=$this->user;
            $where=[
                'member_id'=>$user['id'],
                'id'=>['id','neq',$user['wxmsg_task_id']],
            ];
            $_map=[
                'member_id'=>$user['id'],
                'task_id'=>['task_id','neq',$user['wxmsg_task_id']]
            ];
            $tasking=$this->tasking;
            $table=input('table/s',$tasking);
            $model=$table==$tasking?model($tasking):model($this->tasked);
            
            $del=$model->del($where);
            if($del){
                $device=model('task_device')->readAll($_map,0,['field'=>'device_id']);
                // 执行中
                $deving=model('task_device')->readAll(array_merge($_map,['state'=>1]),0,['field'=>'device_id']);
                if(count($device)){
                    // 移除队列
                    $_del=model('task_device')->del($_map);
                    if($_del){
                        foreach ($device as $k => $v) {
                            $device[$k]=$v['device_id'];
                        }
                        if(count($deving)){
                            // 移除了正在执行的任务队列应该进行 下一个任务
                            // (并通知移动端停止执行该任务)
                            $taskDevModel=model('task_device');
                            foreach ($deving as $k => $v) {
                                $taskDevModel->nextTask($user['id'],$v['device_id'],true,true);
                            }
                        }else{
                            // 通知任务队列更新
                            model('task_device')->updateDev($user['id'],[],$device);
                        }
                        
                    }
                }
                return json(lang('Successful operation'));
            }
            return json(lang('Failed operation'),1);
        }
    }
}